#include <iostream>
#include <string>
#include <mutex>
#include <pthread.h>

const int Num = 5;
int tickets = 1000;
size_t queue
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//1.对象汇总

class ThreadData // 线程数据对象
{
public:
    ThreadData(std::string name, pthread_mutex_t *pmutex, pthread_cond_t *pFull,pthread_cond_t *pEmpty) 
    : _name(name),
     _pmutex(pmutex),
     _pFull(pFull),
     _pEmpty(pEmpty)
    {
        ;
    }
    ~ThreadData()
    {
        ;
    }

public:
    std::string _name;

    //锁变量
    pthread_mutex_t *_pmutex;

    //条件变量
    pthread_cond_t *_pFull;//判满
    pthread_cond_t *_pEmpty;//判空

    //信号量
    // sem_t ComuserNeed;//消费需求量
    // sem_t ProductorPrivate;//生产者产出成品量
    // sem_t CmsNeed;//消费需求量
    // sem_t ProPrivate;//生产者产出成品量
};

class Mutex() // 锁对象(封装了一下锁)
{
public:
    Mutex(pthread_mutex_t * pmutex) : _pmutex(pmutex)
    {
        ;
    }
    ~Mutex()
    {
        ;
    }
    void Lock()
    {
        pthread_mutex_lock(_pmutex);
    }

    void UnLock()
    {
        pthread_mutex_unlock(_pmutex);
    }

private:
    pthread_mutex_t *_pmutex;
};

class MutexGurad // 锁管家对象(RAII智能指针风格的使用锁)
{
public:
    MutexGurad(pthread_mutex_t *pmtx) : Mtx(pmtx) // 会调用Mtx的构造函数
    {
        _Mtx.Lock();
    }
    ~MutexGurad()
    {
        _Mtx.UnLock();
    }

private:
    Mutex _Mtx;
};

class RingQueue
{

};

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//2.方法汇总
void Service(pthread_cond_t* pcond)//cond wait
{
    pthread_cond_wait(pcond);
    std::cout<<"done one works"<<std::endl;
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//3.线程函数汇总
// void *getTickets(void *arg)
// {
//     ThreadData* tdata=(ThreadData*)arg;
//     std::string name=tdata->_name;
//     pthread_mutex_lock(tdata->_pmutex);
//     Service(tdata->_pcond);//cond wait
//     pthread_mutex_unlock(tdata->_pmutex);

// }

void* Comuser(void* arg)
{
    ThreadData* tdata=(ThreadData*)arg;
    std::string name=tdata->_name;
    pthread_mutex_lock(tdata->_pmutex);
    
    
    pthread_mutex_unlock(tdata->_pmutex);
}
void* Productor(void* arg)
{

}

int main()
{
    thread_mutex_t mutex;
    thread_cond_t cond;
    thread_mutex_init(&mutex, nullptr);
    thread_cond_init(&cond, nullptr);

    thread_t tids[Num];

    for (int i = 0; i < Num; i++)
    {
        std::string name = "i am thread ";
        name += std::to_string(i);
        ThreadData *tdata = new ThreadData(name, &mutex, &cond); // 所有线程的数据拿到的是同一把锁
        thread_create(tids + i, nullptr, getTickets, (void *)tdata);
    }

    thread_mutex_destroy(&mutex);
    thread_cond_destroy(&cond);
    return 0;
}